#ifndef OBJC_CLASSES_OBJECT_H
#define OBJC_CLASSES_OBJECT_H
#ifdef __OBJC__

#include <sobjc.h>

@interface Object
{
  Class isa;
}

/* Initializing classes and instances */

+ (void)initialize;
- (Self)init;

/* Creating, freeing, and copying instances */
+ (Instance)new;
+ (Instance)alloc;
- (void)free;
- (Self)copy;

/* Identifying classes */

+ (Class)class;
+ (Class)superclass;
+ (const char *)name;
- (Class)class;
- (Class)superclass;
- (const char *)name;

/* Identifying and comparing instances */

- (Self)self;
- (unsigned int)hash;
- (BOOL)isEqual:(id)anObject;

/* Testing inheritance relationships */

- (BOOL)isKindOfClass:(Class)aClass;
- (BOOL)isMemberOfClass:(Class)aClass;

/* Testing class functionality */

+ (BOOL)instancesRespondToSelector:(SEL)aSelector;
- (BOOL)respondsToSelector:(SEL)aSelector;

/* Testing protocol conformance */

- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
+ (BOOL)conformsToProtocol:(Protocol *)aProtocol;

/* Obtaining method handles */

- (IMP)methodForSelector:(SEL)aSelector;
+ (IMP)instanceMethodForSelector:(SEL)aSelector;

/* Sending messages determined at run time */

- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)anObject;
- (id)performSelector:(SEL)aSelector withObject:(id)anObject withObject:(id)anotherObject;

/* Enforcing intentions */
 
- (void)subclassResponsibilitySelector:(SEL)aSelector;
- (void)notImplementedSelector:(SEL)aSelector;

/* Error handling */

- (void)doesNotRecognizeSelector:(SEL)aSelector;

@end

#endif /* __OBJC__ */
#endif /* OBJC_CLASSES_OBJECT_H */

